package com.bajiao.service.order;

import com.bajiao.entity.order.CouponOrder;
import com.bajiao.entity.order.Order;
import com.bajiao.entity.order.RefundCouponOrder;
import com.bajiao.entity.user.UserCoupon;
import com.bajiao.vo.order.CouponOrderAdmin;
import com.bajiao.vo.order.CouponOrderDetailsResponse;
import com.bajiao.vo.order.CouponOrderResponse;
import com.bajiao.vo.order.OrderDetailsResponse;
import com.baomidou.mybatisplus.extension.service.IService;

import java.util.List;
import java.util.Map;

/**
 * @Description: 优惠券订单
 * @Author: FanJq
 * @Date:   2024-12-14
 * @Version: V1.0
 */
public interface CouponOrderService extends IService<CouponOrder> {

    /**
     * @Description
     * 根据订单编号获取
     * @date 2024/12/16 10:22
     * @author FanJq
     * @param userId
     * @param orderNo
     * @return {@link CouponOrder}
    */
    CouponOrder getByOrderNo(String userId, String orderNo);

    /**
     * @Description
     * 确认订单
     * @date 2024/12/18 16:01
     * @author FanJq
     * @param userId
     * @param couponId
     * @return {@link CouponOrder}
    */
    CouponOrder confirm(String userId, String couponId);

    /**
     * @Description
     * 创建订单
     * @date 2024/12/18 16:20
     * @author FanJq
     * @param userId
     * @param couponId
     * @param remark
     * @return {@link CouponOrder}
    */
    CouponOrder create(String userId, String couponId, String remark);

    /**
     * @Description
     * 订单支付
     * @date 2024/12/18 16:17
     * @author FanJq
     * @param userId
     * @param couponId
     * @param remark
     * @return {@link String}
    */
    String toPay(String userId, String couponId, String remark);

    /**
     * 多个优惠劵兑换
     */
    List<String> toNewPay(String userId, String couponId, String remark);

    /**
     * @Description
     * 支付完成
     * @date 2024/12/18 16:31
     * @author FanJq
     * @param order
     * @return
    */
    void complete(CouponOrder order);

    /**
     * @Description
     * 订单分页列表
     * @date 2024/12/18 17:24
     * @author FanJq
     * @param userId
     * @param status
     * @return {@link List< CouponOrderResponse>}
    */
    List<CouponOrderResponse> getOrderPage(String userId, Integer status);

    /**
     * @Description
     * 同步订单状态
     * @date 2024/12/19 10:36
     * @author FanJq
     * @param userCoupon
     * @return
    */
    void syncStatus(UserCoupon userCoupon);

    /**
     * @Description
     * 取消订单
     * @date 2024/12/19 11:17
     * @author FanJq
     * @param userId
     * @param orderNo
     * @return
    */
    void cancel(String userId, String orderNo);

    /**
     * @Description
     * 申请退款
     * @date 2024/12/20 14:19
     * @author FanJq
     * @param userId
     * @param orderNo
     * @param reason
     * @return {@link String}
    */
    String askRefund(String userId, String orderNo, String reason);

    /**
     * @Description
     * 获取订单详情
     * @date 2024/12/20 15:52
     * @author FanJq
     * @param userId
     * @param orderNo
     * @return {@link CouponOrderDetailsResponse}
    */
    CouponOrderDetailsResponse getDetails(String userId, String orderNo);

    /**
     * @Description
     * 立即使用
     * @date 2024/12/23 17:56
     * @author FanJq
     * @param userId
     * @param couponId
     * @return {@link OrderDetailsResponse}
     */
    CouponOrderDetailsResponse getUseIndex(String userId, String couponId);

    /**
     * @Description
     * 订单执行退款逻辑
     * @date 2024/12/20 15:11
     * @author FanJq
     * @param refundCouponOrder
     * @param status
     * @return
    */
    void refundLogic(RefundCouponOrder refundCouponOrder, int status);

    /**
     * @Description
     * 管理后台列表
     * @date 2025/1/8 11:01
     * @author FanJq
     * @param orderNo
     * @param keywords
     * @param title
     * @param status
     * @param createTimeBegin
     * @param createTimeEnd
     * @return {@link List< CouponOrderAdmin>}
    */
    List<CouponOrderAdmin> getAdminList(String orderNo, String keywords, String title, Integer status, String createTimeBegin, String createTimeEnd);

    /**
     * @Description
     * 订单统计
     * @date 2025/2/12 14:03
     * @author FanJq
     * @param
     * @return {@link Map< String, Object>}
    */
    Map<String, Object> getOrderStat();

    /**
     * @Description
     * 优惠券订单过期事件
     * @date 2025/2/19 19:01
     * @author FanJq
     * @param order
     * @return
     */
    void expiredEvent(CouponOrder order);
}
